Jaká je nejrychlejší metoda pro převod java.nio.ByteBuffer a na (nově vytvořený) CharBuffer b nebo char [] b. Přitom je důležité, aby a [i] == b [i]. To znamená, že ne a [i] a [i + 1] společně tvoří hodnotu b [j], co by udělalo getChar (i), ale hodnoty by měly být „spread“. byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // každý bajt (které jsou podepsané) char b [] = {1,2,3, 125,126,127, 128, 129, 130} // každý znak (které jsou nepodepsané) Všimněte si, že byte: -128 má stejné (nižší 8) bity jako char: 128. Proto předpokládám, že „nejlepší“ interpretace bude taková, jak jsem ji poznamenal výše, protože bity jsou stejné. Poté potřebuji také překlad naopak: Nejúčinnější způsob, jak získat char [] nebo java.nio.CharBuffer zpět do java.nio.ByteBuffer.
2021-01-06 08:17:55
To, co chcete, je převést pomocí kódování ISO-8859-1. Netvrdím nic o efektivitě, ale alespoň je celkem krátké napsat: Výsledek CharBuffer = Charset.forName ("ISO-8859-1"). Dekódovat (byteBuffer); Druhý směr by byl: Výsledek ByteBuffer = Charset.forName ("ISO-8859-1"). Encode (charBuffer); Změřte to prosím oproti jiným řešením. (Abychom byli spravedliví, část Charset.forName by neměla být zahrnuta a měla by být také provedena pouze jednou, nikoli znovu pro každou vyrovnávací paměť.) Od Javy 7 existuje také třída StandardCharsets s předem vytvořenými instancemi Charset, takže můžete použít Výsledek CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer); a Výsledek ByteBuffer = StandardCharsets.ISO_8859_1.encode (charBuffer); namísto. (Tyto řádky fungují stejně jako ty předchozí, pouze vyhledávání je snazší a nehrozí chybné zadání jmen a není třeba chytat nemožné výjimky.) | Souhlasil bych s @ Ishtar, navrhnout, aby se vůbec vyhnul převodu na novou strukturu a převádět pouze tak, jak potřebujete. Pokud však máte hromadu ByteBuffer, můžete to udělat. ByteBuffer bb = ... byte [] pole = bb.array (); char [] chars = nový char [bb.remaining ()]; for (int i = 0; i